package com.cty.nio;

import java.nio.ByteBuffer;

/**
 * @Auther: cty
 * @Date: 2020/4/17 17:24
 * @Description: Buffer的使用
 * Buffer 应用固定逻辑
 *      写操作顺序：
 *          1. buffer.clear(); -> 清空缓存
 *          2. buffer.put(bytes); -> 将字节数组中的数据写入缓存
 *          3. buffer.flip();  -> 重置游标
 *          4. SocketChannel.write(buffer); -> 从缓存读取数据并发送到网络的另一端
 *          5. buffer.clear(); -> 清空缓存
 *      读操作顺序：
 *          1. buffer.clear(); -> 清空缓存
 *          2. SocketChannel.read(buffer); -> 从网络的另一端读取数据并写入缓存
 *          3. buffer.flip();  -> 重置游标
 *          4. buffer.get(); -> 从缓存中读取数据并写入字节数组
 *          5. buffer.clear(); -> 清空缓存
 *      总之：写前清缓存，读前置游标！
 * @version: 1.0
 */
public class TestBuffer {
    public static void main(String[] args){
        // 定义一块容量为8B的Buffer缓存
        ByteBuffer buffer = ByteBuffer.allocate(8);
        // 定义一个字节数组
        byte[] bytes = new byte[]{3, 2, 1};

        // 写入数据之前：java.nio.HeapByteBuffer[pos=0 lim=8 cap=8]
        // pos - 游标位置，lim - 限制存放字节数，cap - 最大容量
        System.out.println("写入数据之前："+buffer);

        // 将字节数组存入缓存
        buffer.put(bytes);
        // 写入数据之后：java.nio.HeapByteBuffer[pos=3 lim=8 cap=8]
        System.out.println("写入数据之后："+buffer);

        // 重置游标 -> lim=pos; pos=0;
        buffer.flip();
        // 重置游标之后：java.nio.HeapByteBuffer[pos=0 lim=3 cap=8]
        System.out.println("重置游标之后："+buffer);
        // buffer.get() -> pos+=1;
        // System.out.println("当前游标指向字节："+buffer.get());

        // 打印buffer中的数据
        // 0 - 3
        // 1 - 2
        // 2 - 1
        for(int i=0; i<buffer.remaining(); i++){
            System.out.println(i+" - "+buffer.get(i));
        }

        // 清空buffer -> pos=0; lim=cap;
        buffer.clear();
        // 清空buffer之后：java.nio.HeapByteBuffer[pos=0 lim=8 cap=8]
        System.out.println("清空buffer之后："+buffer);

    }
}
